# -*- coding: utf-8 -*-
import sys
import time
import colorama


class Progress_Option:
    def __init__(self, max_value, fill_char='#', hex_color='#00FF00'):
        """
        初始化 Progress 类的实例。

        :param max_value: 进度条的最大值，代表任务的总量
        :param fill_char: 进度条的填充字符，默认为 '#'
        :param hex_color: 进度条的十六进制颜色代码，默认为 '#00FF00'（绿色）
        """
        colorama.init()
        self.max_value = max_value
        self.current_value = 0
        self.fill_char = fill_char
        r, g, b = self.__hex_to_rgb(hex_color)
        self.color = self.__rgb_to_ansi(r, g, b)
        self.end_color = '\033[0m'
        self.start_time = time.time()

    def increment(self, step=1):
        """
        增加当前进度的值，并更新进度条显示。

        :param step: 进度增加的步长，默认为 1
        """
        self.current_value = min(self.current_value + step, self.max_value)
        self.display()

    def display(self):
        """
        显示当前进度条，包括进度百分比、已完成数量、预计剩余时间。
        """
        progress = (self.current_value / self.max_value) * 100
        bar_length = 50
        filled_length = int(bar_length * self.current_value // self.max_value)
        bar = self.fill_char * filled_length + ' ' * (bar_length - filled_length)
        colored_bar = f"{self.color}{bar}{self.end_color}"

        elapsed_time = time.time() - self.start_time
        if self.current_value > 0:
            estimated_total_time = (elapsed_time / self.current_value) * self.max_value
            estimated_remaining_time = estimated_total_time - elapsed_time
            estimated_remaining_time_str = time.strftime("%H:%M:%S", time.gmtime(estimated_remaining_time))
        else:
            estimated_remaining_time_str = "未知"

        sys.stdout.write(
            f'\r进度: |{colored_bar}| {progress:.2f}% ({self.current_value}/{self.max_value}) 预计剩余时间: {estimated_remaining_time_str}')
        sys.stdout.flush()

    def __hex_to_rgb(self, hex_color):
        """
        将十六进制颜色代码转换为 RGB 元组。

        :param hex_color: 十六进制颜色代码，如 '#FF0000'
        :return: RGB 元组，如 (255, 0, 0)
        """
        hex_color = hex_color.lstrip('#')
        return tuple(int(hex_color[i:i + 2], 16) for i in (0, 2, 4))

    def __rgb_to_ansi(self, r, g, b):
        """
        将 RGB 值转换为 ANSI 转义序列，用于设置终端文本颜色。

        :param r: 红色通道值，范围 0 - 255
        :param g: 绿色通道值，范围 0 - 255
        :param b: 蓝色通道值，范围 0 - 255
        :return: ANSI 转义序列字符串
        """
        return f"\033[38;2;{r};{g};{b}m"

# if __name__ == "__main__":
#     # 可以修改填充字符和十六进制颜色
#     progress = Progress(100, fill_char='*', hex_color='#FFA500')
#     for _ in range(10):
#         progress.increment(step=10)
#         time.sleep(0.1)
#     colorama.deinit()
#     print()
